<?php

class Autoevaluacion_Model_Listas extends Model_Cna {
	
	private $listasTable;
	
	public function __construct() {
		parent::__construct();
		$this->listasTable = new Autoevaluacion_Model_DbTable_Listas();
	}
	
	/**
	 * Obtiene las listas de completitud ordenadas por nombre
	 * @return array
	 */
	public function getListasCompletitud() {
	    $datos =  $this->listasTable->getListas("C");
	    foreach($datos as $key => $value) {
            if(!empty($value["codlistafactores"])) {
                $factor = $this->getLista($value["codlistafactores"]);
                //Zend_Debug::dump($factor,"FACTOR");
                $datos[$key]["nombrelistafactores"] = $factor["nombre"];
            }
        }
        return $datos;
	}
	
	/**
	 * Obtiene los subtipos de lista para llenar los combobox de subtipolista
	 * para las listas de completitud
	 * @return array la llave del array es el valor de la llave primaria de subtipolista
	 */
	public function getSubTipoListasCompletitudForSelect() {
	    return $this->getSubTipoListasForSelect("C");
	}
	
	/**
	 * Obtiene las listas de factores ordenadas por nombre
	 * @return array
	 */
	public function getListasFactores() {
	    return $this->listasTable->getListas("F");
	}
	
	/**
	 * Obtiene los subtipos de lista para llenar los combobox de subtipolista
	 * para las listas de factores
	 * @return array la llave del array es el valor de la llave primaria de subtipolista
	 */
	public function getSubTipoListasFactoresForSelect() {
	    return $this->getSubTipoListasForSelect("F");
	}
	
	/**
	 * Obtiene las listas de informacion de autoevaluacion ordenadas por nombre
	 * @return array
	 */
	public function getListasInfoAutoevaluacion() {
	    return $this->listasTable->getListas("A");
	}
	
	/**
	 * Obtiene los subtipos de lista para llenar los combobox de subtipolista
	 * para las listas de informacion de autoevaluacion
	 * @return array la llave del array es el valor de la llave primaria de subtipolista
	 */
	public function getSubTipoListasInfoAutoevaluacionForSelect() {
	    return $this->getSubTipoListasForSelect("A");
	}
	
	/**
	 * Obtiene las listas de consideraciones para informe de pares ordenadas por nombre
	 * @return array
	 */
	public function getListasInformePares() {
	    return $this->listasTable->getListas("P");
	}
	
	/**
	 * Obtiene los subtipos de lista para llenar los combobox de subtipolista
	 * para las listas de consideraciones para informe de pares
	 * @return array la llave del array es el valor de la llave primaria de subtipolista
	 */
	public function getSubTipoListasInformeParesForSelect() {
	    return $this->getSubTipoListasForSelect("P");
	}
	
	private function getSubTipoListasForSelect($tipo) {
	    $subtipoTable = new Autoevaluacion_Model_DbTable_SubTipoListas();
		$datos = $subtipoTable->getSubTipoListas($tipo);
		$arrTipos = array();
		foreach ($datos as $tipo) {
			$arrTipos[$tipo["codsubtipolista"]] = $tipo["nombre"];
		}
	    return $arrTipos;
	}
	
	
	/**
	 * Almacena los datos de una lista en la base de datos
	 * @param array $datos Los datos de la lista
	 * @return integer la llave primaria de la lista creada o modificada
	 */
	public function guardarLista(array $datos) {
	    try {
    		if(!empty($datos["codlista"])) {
    			$codlista = $this->listasTable->find($datos["codlista"])->current()->setFromArray($datos)->save();
    		} else {
    		    unset($datos["codlista"]);
    		    $this->listasTable->getAdapter()->beginTransaction();
    			$codlista = $this->listasTable->createRow($datos)->save();
    			$this->listasTable->getAdapter()->commit();
    		}
    		
    	    if($datos["tipolista"]=="F" && $datos["activo"]=="S") {
    		    $this->verificarIntegridadListaFactores($codlista);
    		}
    		
	    } catch (Exception $e) {
	        $this->listasTable->getAdapter()->rollBack();
	        throw $e;
	    }
		return $codlista;
	}
	
	/**
	 * Obtiene un registro de una lista en forma de array
	 * @param integer $codlista
	 * @return array Asociativo con las columnas del registro de la lista
	 */
	public function getLista($codlista) {
		return $this->listasTable->find($codlista)->current()->toArray();
	}
	
	/**
	 * Obtiene el registro de la lista de Factores activa para el diligenciamiento de escalas de gradación.
	 * @param integer $codsubtipolista Código del subtipo de la lista (tipo del proceso)
	 * @return null|array Asociativo con las columnas del registro de la lista
	 */
	public function getListaFactoresActiva($codsubtipolista) {
		$row = $this->listasTable->fetchRow("tipolista='F' AND activo='S' AND codsubtipolista={$codsubtipolista}");
		return $row->toArray();
	}
	
	/**
	 * Método para asegurar la integridad de las listas de factores al ser creadas
	 * @param integer $codlista
	 */
	private function verificarIntegridadListaFactores($codlista) {
	    $datosLista = $this->getLista($codlista);
//	    Zend_Debug::dump($datos);
	    $row = $this->listasTable->fetchRow("tipolista='F' AND activo='S' AND codsubtipolista={$datosLista["codsubtipolista"]}  AND codlista<>{$codlista}");
	    
	    if(!is_null($row)) {
	        $datos = array();
		    $datos["activo"] = "N";
	        $this->listasTable->update($datos, "tipolista='F' AND codlista<>{$codlista} AND codsubtipolista={$datosLista["codsubtipolista"]}");
	    }
	    
	}
	/**
	 * Obtiene los datos de la lista activa
	 * @param String $tipo
	 * @param Integer $subtipo
	 * @param Integer $codproceso Código del proceso
	 * @return Array Datos de la lista activa
	 */
	public function getListaActiva($tipo,$subtipo,$codproceso="",$tipousuario="",$activa=false) {
		return $this->listasTable->getListaActiva($tipo,$subtipo,$codproceso,$tipousuario,$activa);
	}
	/**
	 * Crea y retorna los datos de la lista activa
	 * @param String $tipo
	 * @param integer $subtipo
	 * @param Integer $codproceso Código del proceso
	 * @param Integer $codlsta Código de la lista de plantilla activa
	 */
	public function crearListaActiva($tipo,$subtipo,$codproceso,$codlistaactiva,$tipousuario="I"){
        $this->listasTable->getAdapter()->beginTransaction();
	    try {
	        $datos = array("tipolista"=>$tipo,"codsubtipolista"=>$subtipo,"codproceso"=>$codproceso,"nombre"=>"LISTA DE FACTORES",
	                        "descripcion"=>"LISTA DE FACTORES CREADA POR EL SISTEMA","activo"=>"S","tipousuario"=>$tipousuario);
	        
	        if ($tipousuario=="P"){
	            $datos["finalizada"]="S";
	        }
	        
	        $codlista = $this->listasTable->createRow($datos)->save();
	        $detalleLista = new Autoevaluacion_Model_DetalleLista();
	        $datos_seccion = $detalleLista->getSecciones($codlistaactiva);
	        foreach ($datos_seccion as $value):
	            $datos_seccion = $value;
	            $datos_seccion["codlista"]=$codlista;
	            unset($datos_seccion["codseccionlista"]);
	            $codseccion = $detalleLista->guardarSeccion($datos_seccion);
	            foreach ($value["elementos"] as $index => $elemento):
	                $detalleLista->asignarElementoSeccion($elemento["codelementolista"], $codseccion);
	            endforeach;
	            unset($datos_seccion);
	        endforeach;
	        $this->listasTable->getAdapter()->commit();
	        return $codlista;

	    } catch (Exception $e) {
	        $this->listasTable->getAdapter()->rollBack();
	        throw $e;
	    }
	}
	
	

	/**
	 * Elimina la lista de un proceso
	 * @param $codproceso Código del proceso
	 * @param $tipolista Tipo lista
	 */
	public function eliminarLista($codproceso, $tipolista="F"){
	    return $this->listasTable->delete("codproceso={$codproceso} AND tipolista='{$tipolista}' ");
	}
		
}//fin de la clase